class Personal::EjecutivoController < ApplicationController
  require 'csv'
  
  def index
    
    if perfil_nacional?
      nacional
      render :action => 'list'
    elsif perfil_asistente?
      asistente
      render :action => 'list'
    else
      list
      render :action => 'list'
    end
  end

  # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
  verify :method => :post, :only => [ :destroy, :create, :update ],
    :redirect_to => { :action => :list }

  def list
    current_user = Ejecutivo.find(session[:user])
    admin_value = EntradasCatalogo.find_by_valor('Administrador Sistema')

    logger.debug 'admin_value ' + admin_value.to_s

    if current_user.puesto_id == admin_value.alternate_id
      @ejecutivos = Ejecutivo.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'usuario'
      @ejecutivos_count =  0 #Ejecutivo.count

    elsif current_user.children.size > 0
      these_children = find_children_ids(current_user)
      @ejecutivos = Ejecutivo.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'usuario', :conditions => {:id => these_children}
      @ejecutivos_count = Ejecutivo.count(:conditions => {:id => these_children})

    else
      these_children = find_children_ids(current_user)
      @ejecutivos = Ejecutivo.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'usuario', :conditions => {:id => these_children}
      @ejecutivos_count = Ejecutivo.count(:conditions => {:id => these_children})

    end

  end

  def show
    @ejecutivo = Ejecutivo.find(params[:id])
    
    @children = Ejecutivo.find(:all, :conditions => {:reporta_a_id => params[:id], :status_id => 1})
  end

  def new
    @ejecutivo = Ejecutivo.new
    @regiones = Catalogo.find_by_nombre('Regiones Ejecutivos').entradas_catalogo

  end

  def create
    @ejecutivo = Ejecutivo.new(params[:ejecutivo])
    @ejecutivo.status_id = 1
    
    if @ejecutivo.reporta_a_id == 0
      @ejecutivo.reporta_a_id = nil
    end
    
    if @ejecutivo.save
      flash[:notice] = 'El Ejecutivo se agrego correctamente.'
      redirect_to :action => 'list'
    else
      @regiones = Catalogo.find_by_nombre('Regiones Ejecutivos').entradas_catalogo
      render :action => 'new'
    end
  end

  def edit
    @ejecutivo = Ejecutivo.find(params[:id])
    @regiones = Catalogo.find_by_nombre('Regiones Ejecutivos').entradas_catalogo
    @status = Catalogo.find_by_nombre('Status Items').entradas_catalogo
    @ejecutivos = Ejecutivo.find(:all, :conditions => {:status_id => 1})

  end

  def update
    @ejecutivo = Ejecutivo.find(params[:id])
    if @ejecutivo.update_attributes(params[:ejecutivo])
      flash[:notice] = 'El Ejecutivo se actualizo correctamente.'
      redirect_to :action => 'show', :id => @ejecutivo
    else
      @regiones = Catalogo.find_by_nombre('Regiones Ejecutivos').entradas_catalogo
      render :action => 'edit'
    end
  end

  def destroy
    Ejecutivo.find(params[:id]).destroy
    redirect_to :action => 'list'
  end
  
  def txt_export
    ejecutivo = Ejecutivo.find(session[:user])
    these_children = find_children_ids(ejecutivo)

    if perfil_nacional?
      @ejecutivos = Ejecutivo.find(:all)
    else
      conditions = {}
      conditions[:id] = these_children
      @ejecutivos = Ejecutivo.find(:all, :conditions => conditions)
    end
    
    report = StringIO.new
    CSV::Writer.generate(report, ',') do |csv|
      # encabezados
      csv << [
        "No Empleado", "Nombre", "Primer Apellido", "Segundo Apellido", "Correo Electronico",
        "Puesto", "Reporta A", "Region"
      ]
      
      @ejecutivos.each do |e|
        if e.reporta_a_id.nil?
          jefe_inmediato = ""
        else
          jefe_inmediato = Ejecutivo.find(e.reporta_a_id).nombre_completo
        end
          
        csv << [
          e.numero_empleado, e.nombre, e.primer_apellido, e.segundo_apellido, e.correo_electronico,
          Catalogo.valor("Puestos Ejecutivos",e.puesto_id), jefe_inmediato, Catalogo.valor('Regiones Ejecutivos',e.region_id)
        ]
      end
    end
    
    report.rewind
    send_data(report.read,
      :type => 'text/csv; charset=iso-8859-1; header=present',
      :filename => 'ejecutivos.csv')
    
  end
  
  def deshabilitar
    ejecutivo = Ejecutivo.find(params[:id])
    
    ejecutivo.status_id = 0
    
    if ejecutivo.save
      flash[:notice] = "Ejecutivo deshabilitado..."
    end
    redirect_to :action => "index"
  end
  
  def change_pwd
    @ejecutivo = Ejecutivo.find(params[:id])
  end
  
  def update_pwd
    @ejecutivo = Ejecutivo.find(params[:id])
    new_password = params[:new_pwd]
    new_password_confirmation = params[:new_pwd_confirmation]
    @ejecutivo.contrasenia = new_password
    
    if @ejecutivo.save && (new_password.eql?(new_password_confirmation))
      flash[:notice] = "Contrase&ntilde;a Actualizada"
      
      redirect_to :action => 'index'
    else
      flash[:notice] = "No coincide la contrase&ntilde;a..."
      render :action => 'change_pwd', :id => @ejecutivo
    end
  end
  
  def nacional
    conditions = {}
    conditions[:status_id] = 1
    
    @ejecutivos = Ejecutivo.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'usuario', :conditions => conditions
  end
  
  def asistente
    usuario_actual = Ejecutivo.find(session[:user])
    jefe_inmediato = Ejecutivo.find(usuario_actual.reporta_a_id)
    these_children = find_children_ids(jefe_inmediato)
    
    conditions = {}
    conditions[:id] = these_children
    conditions[:status_id] = 1
    
    @ejecutivos = Ejecutivo.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'usuario', :conditions => conditions
  end
  
  def quitar_jefe
    ejecutivo = Ejecutivo.find(params[:id])
    
    if ejecutivo.quitar_jefe
      flash[:notice] = "Se desasocio el ejecutivo"
      
      redirect_to :action => 'index'
    else
      redirect_to :action => 'index'
    end
  end
  
  def agregar_personal
    @ejecutivo = Ejecutivo.find(params[:id])
    
    @personal = @ejecutivo.not_my_people
    
  end
  
  def do_agregar_personal
    unless params[:personal].blank?
      ejecutivo = Ejecutivo.find(params[:personal])
      
      ejecutivo.reporta_a_id = params[:id]
      
      ejecutivo.save!
      
      flash[:notice] = "Se asocio un nuevo ejecutivo"
      redirect_to :action => 'show', :id => params[:id]
    end
  end
end
